15.01.2015 (четверг)

Для того, чтобы не было тупиковых ситуаций race condition придумали
mutex
Ни процец П1 ни П2 не исполнится, так как у них одни и те же ресурсы.

Алгоритм банкира - после того как один процесс используется он освоюождает ресурс, банкир должен быть уверен в том что процес вернет ресурс, Если возникает тупиковая ситуация, тогда необходимо убить ресурс.

Семафоры, мониторы и очереди сообщений.(Semaphores, monitor, messages)/ Семафоры проверяют свободны ли наши ресурсы.

Критическая секция - закрытие ресурса ,если ресурс занят. Если ресур занят закрываем семафор. Можно в семафоре установить значение 500, если он свободен. Как только документ устанавливается мы сбрасываем значение семафоров.

Семафор указывает на входе двери ресурс занят или ресрс свободен или он заполнен на половину и может принять сколько то процессов.

Семафоры - это целая разделяемая переменная с неотрицательными значениями,доступ любого процесса к которой может осуществляться только через две атомарные операции. P - proberen - проверять V-verhogen - увеличивать (от датских слов)

(P,S)

P(S) - пока s=0 процесс блокируется; S=S-1 - процесс блокируется

При выполнении операции P над семафором S сначало проверяетя его значение, если оно больше 0, то из s=s-1 , если оно меньше или равно нулю, то процесс блокируется до тех пор, пока S - не станет больше 0.

После чего из S вычитается 1, при выполнении операции V (увеличении) над семафором (S) к его значению просто прибавляется 1.

в момент создания семафор может принимать любое не отрицательное значение. Процесс , когда подходит к критической секции он проверяет значение семафора.

Семафоры встроены на все операционные системы. В некоторые Ос они встроены в синтаксис. решение проблемыили решение задачи (производитель - потребитель) producer-consumer (производитель потребитель)

процессы обмениваются инфо, они могут использовать для них буфер.

Задача писателя-читателя

Пусть два процесса обмениваются информацией через буфер. Буфер ограниченного размера.

Производитель закладывает инфу в буфер , а потребитель считывает эту инфу из буфера.

Producer
while(1) { produce item; fn1, item } consume while(1) { get item consume item }

Буфер ограниченного размера мы не может туда записывать информацию. потребитель, если буфер пуст потребитель должен ждать пока туда запишуь какуе-то инфу.

Как эта задача решает с помощью семафоров?
Возьмем 3 семафора:
Cемафор empty - производитель записывает инфу только тогда, когда буфер свободен.
Семафор fn1 - будем использовать для организации ожидания производителя при заполненном буфере.
Семафор full - будем использовать для гарантии того , что потребитель будет ждать пока в буфере появится информация.
Семафор mutex - для организации взаимоисключения на критических участках.
В данном случае участки - это put item и get item.

Взаимоисключения - механизм , которых используется для того чтобы два ресурса не стали состязаться за ресурс, а использоваться в необходимое для каждого время.

Пока P(s):S==0, блок; S=S-1; V(S):S=S+1 O<-(1)

P - проверка семафора V- действие над семафором (увеличение над семафоров) Semaphor mutex = 1; //т.е. ресурс свободен, буфер пуст - то что произ изводитель ожидает пока освободиться буфер semaphor empty =N; semaphor full=0;

Producer: //(записывает инфу)
  while(1){
  produce item;
  P(empty);
  P(mutex)
  putt item //наложить
  v(mutex) //увеличиваем mutex
  v(full) //увеличиваем full
}

consumer//(считывает)
  while(1){
  P(full)
  P(mutex)
  get item
  v(mutex)
  V(empty) //как только буфер освободиться
//записать туда информацию
}

P означает действие семафора s=s-1
v - увеличиваем ресурс ,S - освобождает

Семафор может быть не только двоичный. Если ресурс либо занят либо свободен, он может иметь только два состояния.

consumer - следит за семафорами, проверяет их на свободу. есть процесс producer, есть процесс consumer.
Чтобы не возникло конфликтов мы блокируем критическую секцию, наш ресурс это наш буфер.

Семафор в Linux -это модуль ядра, они подключают библиотеки, их пишут на assembler т.е. в винде мы все прописываем самостоятель и управляем ими, в линуксе подключаем библиотеку.

asm/semafore - подключаем библиотеку все фигня прописана в библиотеки семафор в линуксе это типа как прописано инициализация в библиотеки псевдокод для линукса down - добавляем 1 up - увеличиваем void sema_init(strint, semainit) используется алгоритм fifo (кто первый пришел, тот и использует ресурс).

Аппаратная реализация семафоров - (запрет прерываний, прерывания, замок).

Часть 2. Монитор

Монитор - механизм синхронизации, совокупность процедур предназначенная для управления ресурсами определенного типа.

Монитор отвечает за распределение ресурсов, а также контролирует обращение к ним со стороны различных программ. Он полностью отвечает за те ресурсы, которые ему выданы. Это тоже механизм организации параллелизма, который содержит данные и процедуры необходимые для динамического распределения какого-либо общего ресурса или группы общих ресурсов. Чтобы обеспечить выделение необходимого ресурса процесс должен обратиться к конкретной процедуре монитора. Если ресурс занят, то монитор выдает команду wait и процесс, который пожелал войти в монитор должен ожидать вне монитора освобождение этого монитора.

Тогда процесс пожелавший войти в монитор должен ожидать вне монитора. Процесс, который пожелал войти в монитор ожидает его освобождения.

wait
signal

Монитор - набор процедур.
Некоторый процессы могут выйти из монитора не выполнив все процедуры до конца. Те процессы, которые побывали в мониторе ОС ставит их в отдельную очередь. Очередь - уснувшие процессы. Когда монитор освободиться в следующий раз, он просматривает очередь уснувших процессов.

wait(имя, условие)
signal(имя, условие)

Команда wait выполнятся движением запрещенных прерываний и уменьшает содержимое счетчика на 1. Если счетчик меньше 0, то процесс помещается в очередь ожидающих открытие этого монитора и процессор освобождается от этого монитора. Процессор освобождается от этого процесса.

signal -работает в режиме запрещенных прерываний. как только процесс освободился он выбирает из очереди и уменьшает значение счетчика. На абстрактном уровне можно описать структуру мониторого таким образом.

monitor monitor_name {
  описание внутренних переменных
  void m1()
  void mn
  блок инициализации внутренних переменных
}

m1, m2,...,mn - это функции-методы монитора

Блок инициализации внутренних переменных содержит операции, которые выполняются тольк один раз. Либо при создании монитора, либо при самом первом вызове функции и метода монитора.

В задаче produce consume - тоже применимы мониторы. параллельный эвклид и параллельный паскаль эмуляция монитора с помощью системных вызовов для обычных языков программирования. которые широко распространены не так проста, как эмуляция семафора, поэтому в некоторых случаях мониторы применяются в ОС.

Адресация прямая и косвенная

Сообщения - механизм синхронизации (также как семафоры и мониторы)

Для примеров адресации достаточно описать два типа - это приметивы для описания передачи сообщения процессам по линии связи.
send(p, message) //послать сообщение message процессу p
receire(0,message)
в случа не прямой адресации нам нужен ящик куда мы будем отправлять сообщения
send(A, message)//отправить сообщение в ящик А
receire(A,message)//получить сообщение из ящика А

В сообщениях более проста реализая, но передача происходит по более высокоуровнемым организациям. Они между собой эквивалентны. выполняют одну и ту же функцию. Их реализуют мониторы с помощью передачи сообщений.

Часть 3. Диспечиризация в ОС:

За управление процессами отвечают определенные менеджеры

Диспетчер - это программа ОС , которая рпинимает решение о том, какой процесс должен быть запущен в данный момент. и устанавливает машинный счетчик команд, которые содержат адрес следующей выполняемой проги.(команды)

Что делает менеджер управления процессами?
Блок управления процессами или подсистема управлния процессами. менеджер раздает процессору в распоряжение время. Планировщик работает с определенным алгоритмом планирования. сможет ли боле приоритетное время вытеснить выполняемую задачу. Если мы его сможем вытеснить мы должны выполнить прерывание, установить занятость процесса. выкинутый процесс мы ставим в очередь. он переходит в состояние готовности.

в регистре тоже записываются состояния программы. Дескриптор - описывает именно сам процесс, динамическая таблица.
Сохраняет информацию предсмртную записку. Процесс с таким-то номером убил другой.

    В каких случаях управление передается диспетчеру. случаи:
  1. Выполняющаяся программа отказывается от управления и выдает команду wait, блокируя свое выполнение или просто отдает управление системе.
  2. Когда некоторый системный механизм определяет невозможность выполнения проги, блокирует её и обращается к диспетчеру с требованием запустить другую программу.
  3. Происходит прерывание по времени сообщающее об истечении кванта времени для задачи
  4. Одно из ранее заблокированных заданий переводится в состояние готовности и у диспетчера возникает необходимость проверить ту задачу, которая имеет более высокий приоритет

В следующий раз проведут контрольную работу по процессам по базовым понятия рассказать о жизненном цикле процесса и описать коротко.